const FN = {
  parseUrl(url) {
    let result = {}
    const query = url.split('?')[1]
    query.split('&').map(v => {
      const [key, val] = v.split('=')
      result[key] = val
    })
    return result
  },
  getLgTen(str) {
    // 字符串少10 补0
    return (parseInt(str) < 10 && `0${parseInt(str)}`) || str
  },
  formatDate(date, type) {
    type = type || {}
    return (
      date.getFullYear() +
      type.y +
      FN.getLgTen(date.getMonth() + 1) +
      type.m +
      FN.getLgTen(date.getDate()) +
      type.d
    )
  },
  ex(n, p, b) {
    // true 提交数据 false 拿数据
    let o = { p: 1, b: false },
      t
    o.p = !!p && typeof p === 'number' ? p : o.p
    o.b = !!p && typeof p !== 'number' ? !!p : b
    t = o.b ? n * o.p : n / o.p
    return isNaN(t) ? 0 : t
  },
  // 判断数组是否存在
  isRepeat(arr) {
    const hash = {}
    for (let i = 0; i < arr.length; i++) {
      if (hash[arr[i]]) {
        return true
      }
      hash[arr[i]] = true
    }
    return false
  },
  combo(list, maxNum) {
    const r = []
      ; (function f(t, a, n) {
        if (n === 0) return r.push(t)
        for (let i = 0, l = a.length; i <= l - n; i++) {
          f(t.concat(a[i]), a.slice(i + 1), n - 1)
        }
      })([], list, maxNum)
    return r
  },
  factorial(num) {
    return num > 1 ? num * FN.factorial(--num) : 1
  },
  mirror(o) {
    return /^[[{]/.test(o) ? JSON.parse(JSON.stringify(o)) : o
  },
  toObj(s) {
    return /^[[{]/.test(s.replace(/\s*/, '')) ? JSON.parse(s) : {}
  },
  random(len, r) {
    return Math.floor((Math.random() * (r || 100)) % len)
  },
  // 为数字添加千位分隔符
  numFormat(num) {
    num = num.toString().split('.') // 分隔小数点
    const arr = num[0].split('').reverse() // 转换成字符数组并且倒序排列
    let res = []
    for (let i = 0, len = arr.length; i < len; i++) {
      if (i % 3 === 0 && i !== 0) {
        res.push(',') // 添加分隔符
      }
      res.push(arr[i])
    }
    res.reverse() // 再次倒序成为正确的顺序
    if (num[1]) {
      // 如果有小数的话添加小数部分
      res = res.join('').concat(`.${num[1]}`)
    } else {
      res = res.join('')
    }
    return res
  },

  // 这个控制时间为00:00或者 23:59:59
    timeStr(t, b) {
    // t = t.replace(/-/g, '/');
    t = b ? `${t} 00:00:00` : `${t} 23:59:59`
    return t // Math.floor(new Date(t).getTime()/1000);
  },
  
  // 创建日期
  _createDateData() {
    let date = []
    for (let i = 1900; i < 2020; i++) {
      let month = []
      for (let j = 1; j < 13; j++) {
        let day = []
        if (j === 2) {
          for (let k = 1; k < 29; k++) {
            day.push(k + '')
          }
          // Leap day for years that are divisible by 4, such as 2000, 2004
          if (i % 4 === 0) {
            day.push(29 + '')
          }
        } else if (j in { 1: 1, 3: 1, 5: 1, 7: 1, 8: 1, 10: 1, 12: 1 }) {
          for (let k = 1; k < 32; k++) {
            day.push(k + '')
          }
        } else {
          for (let k = 1; k < 31; k++) {
            day.push(k + '')
          }
        }
        let _month = {}
        _month[j + ''] = day
        month.push(_month)
      }
      let _date = {}
      _date[i + ''] = month
      date.push(_date)
    }
    return date
  }
}

export default FN

// 日期格式化
Date.prototype.format = function (fmt, b) {
  b = !!b || !1
  const o = {
    'M+': b ? this.getUTCMonth() + 1 : this.getMonth() + 1,    // 月份
    'd+': b ? this.getUTCDate() : this.getDate(),              // 日
    'h+': b ? this.getUTCHours() : this.getHours(),            // 小时
    'm+': b ? this.getUTCMinutes() : this.getMinutes(),        // 分
    's+': b ? this.getUTCSeconds() : this.getSeconds(),        // 秒
    'q+': Math.floor((b ? this.getUTCMonth() + 3 : this.getMonth() + 3) / 3), // 季度
    S: b ? this.getUTCMilliseconds() : this.getMilliseconds(), // 毫秒
  }
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (b ? `${this.getUTCFullYear()}` : `${this.getFullYear()}`).substr(
        4 - RegExp.$1.length
      )
    )
  }
  for (const k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : `00${o[k]}`.substr(`${o[k]}`.length)
      )
    }
  }
  return fmt
}
